/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ LoginTest.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: Germán Sotelo
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.JSFUnit.tests;

import javax.faces.component.UIComponent;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.ServletTestCase;
import org.jboss.jsfunit.jsfsession.JSFClientSession;
import org.jboss.jsfunit.jsfsession.JSFServerSession;
import org.jboss.jsfunit.jsfsession.JSFSession;
import org.jboss.jsfunit.richclient.RichFacesClient;

/**
 * Test sobre las reglas de navegación del JSF pages/login
 * @author German Sotelo
 */
public class LoginTest extends ServletTestCase {

    public static Test suite() {
        return new TestSuite(LoginTest.class);
    }

    /**
     * Prueba para validar que el administrador es dirigido a la vista correcta
     * @throws java.lang.Exception
     */
    public void testAdministrador() throws Exception {
        JSFSession jsfSession = new JSFSession("/pages/login.jsf");
        JSFClientSession client = jsfSession.getJSFClientSession();
        RichFacesClient richClient = new RichFacesClient(client);

        JSFServerSession server = jsfSession.getJSFServerSession();
        // Test navigation to initial viewID
        assertEquals("/pages/login.xhtml", server.getCurrentViewID());

        // Assert that the prompt component is in the component tree and rendered
        UIComponent prompt = server.findComponent("user");

        assertTrue(prompt.isRendered());
        client.type("aut:user", 'A');
        client.type("aut:user", 'D');
        client.type("aut:user", 'M');
        client.type("aut:user", 'I');
        client.type("aut:user", 'N');
        client.type("aut:user", 'I');
        client.type("aut:user", 'S');
        client.type("aut:user", 'T');
        client.type("aut:user", 'R');
        client.type("aut:user", 'A');
        client.type("aut:user", 'D');
        client.type("aut:user", 'O');
        client.type("aut:user", 'R');
        client.click("aut:ingresar");

        client.getContentPage();
        assertEquals(client.getPageAsText().contains("Usuario invalido"),false);

    }

    /**
     * Prueba para validar que el cliente es dirigido a la vista correcta
     * @throws java.lang.Exception
     */
    public void testCliente() throws Exception {
        JSFSession jsfSession = new JSFSession("/pages/login.jsf");
        JSFClientSession client = jsfSession.getJSFClientSession();
        RichFacesClient richClient = new RichFacesClient(client);

        JSFServerSession server = jsfSession.getJSFServerSession();
        // Test navigation to initial viewID
        assertEquals("/pages/login.xhtml", server.getCurrentViewID());

        // Assert that the prompt component is in the component tree and rendered
        UIComponent prompt = server.findComponent("user");

        assertTrue(prompt.isRendered());
        client.type("aut:user", 'C');
        client.type("aut:user", 'L');
        client.type("aut:user", 'I');
        client.type("aut:user", 'E');
        client.type("aut:user", 'N');
        client.type("aut:user", 'T');
        client.type("aut:user", 'E');
        client.click("aut:ingresar");

        client.getContentPage();
        assertEquals(client.getPageAsText().contains("Usuario invalido"),false);

    }

    /**
     * Prueba para el caso de un usuario inválido
     * @throws java.lang.Exception
     */
    public void testInvalid() throws Exception {
        JSFSession jsfSession = new JSFSession("/pages/login.jsf");
        JSFClientSession client = jsfSession.getJSFClientSession();
        RichFacesClient richClient = new RichFacesClient(client);

        JSFServerSession server = jsfSession.getJSFServerSession();
        // Test navigation to initial viewID
        assertEquals("/pages/login.xhtml", server.getCurrentViewID());
        // Assert that the prompt component is in the component tree and rendered
        UIComponent prompt = server.findComponent("user");

        assertTrue(prompt.isRendered());
        client.type("aut:user", 'I');
        client.type("aut:user", 'N');
        client.type("aut:user", 'V');
        client.type("aut:user", 'A');
        client.type("aut:user", 'L');
        client.type("aut:user", 'I');
        client.type("aut:user", 'D');
        client.click("aut:ingresar");

        client.getContentPage();
        assertEquals(client.getPageAsText().contains("Usuario invalido"),false);

    }
}
